home *** CD-ROM | disk | FTP | other *** search
/ Sprite 1984 - 1993 / Sprite 1984 - 1993.iso / src / lib / c / sync / symm.md / RCS / Sync_GetLock.s,v < prev   
Text File  |  1990-10-31  |  3KB  |  140 lines

  1. head     1.2;
  2. branch   ;
  3. access   ;
  4. symbols  ;
  5. locks    ; strict;
  6. comment  @ * @;
  7.  
  8.  
  9. 1.2
  10. date     90.10.31.17.44.23;  author kupfer;  state Exp;
  11. branches ;
  12. next     1.1;
  13.  
  14. 1.1
  15. date     90.10.31.17.41.10;  author kupfer;  state Exp;
  16. branches ;
  17. next     ;
  18.  
  19.  
  20. desc
  21. @@
  22.  
  23.  
  24. 1.2
  25. log
  26. @Can't have comments in comments.
  27. @
  28. text
  29. @/*
  30.  * syncAsm.s --
  31.  *
  32.  *    Source code for the Sync_GetLock library procedure.
  33.  *
  34.  * Copyright 1988 Regents of the University of California
  35.  * Permission to use, copy, modify, and distribute this
  36.  * software and its documentation for any purpose and without
  37.  * fee is hereby granted, provided that the above copyright
  38.  * notice appear in all copies.  The University of California
  39.  * makes no representations about the suitability of this
  40.  * software for any purpose.  It is provided "as is" without
  41.  * express or implied warranty.
  42.  */
  43.  
  44.     .data
  45.     .asciz "$Header: /sprite/src/lib/c/sync/symm.md/RCS/Sync_GetLock.s,v 1.1 90/10/31 17:41:10 kupfer Exp Locker: kupfer $ SPRITE (Berkeley)"
  46.     .align 2
  47.     .text
  48.  
  49. /* $Log:    Sync_GetLock.s,v $
  50.  * Revision 1.1  90/10/31  17:41:10  kupfer
  51.  * Initial revision
  52.  * 
  53.  * Revision 1.2  90/03/05  14:41:32  rbk
  54.  * Add call to Sync_SlowLock() if can't get it right away.
  55.  * Cleaned up a bit (use # in line comments), and loose save/restore of
  56.  * scratch registers.
  57.  * 
  58.  * Revision 1.1  90/03/05  10:13:44  rbk
  59.  * Initial revision
  60.  * 
  61.  * Based on Sync_GetLock.s,v 1.1 88/06/19 14:34:17 ouster
  62.  */
  63.  
  64. #include "kernel/machAsmDefs.h"
  65.  
  66.  
  67. /*
  68.  * ----------------------------------------------------------------------------
  69.  *
  70.  * Sync_GetLock --
  71.  *
  72.  *    Acquire a lock.  Other processes trying to acquire the lock
  73.  *    will block until this lock is released.
  74.  *
  75.  *      A critical section of code is protected by a lock.  To safely
  76.  *      execute the code, the caller must first call Sync_GetLock to
  77.  *      acquire the lock on the critical section.  At the end of the
  78.  *      critical section the caller has to call Sync_Unlock to release
  79.  *      the lock and allow other processes to execute in the critical
  80.  *      section.
  81.  *
  82.  * Results:
  83.  *    None.
  84.  *
  85.  * Side effects:
  86.  *      The lock is set.  Other processes will be blocked if they try
  87.  *      to lock the same lock.  A blocked process will try to get the
  88.  *      lock after this process unlocks the lock with Sync_Unlock.
  89.  *
  90.  * C equivalent:
  91.  *
  92.  *    void
  93.  *    Sync_GetLock(lockPtr)
  94.  *       Sync_Lock *lockPtr;
  95.  *    {
  96.  *        if (Sun_TestAndSet(&(lockPtr->inUse)) != 0) {
  97.  *        Sync_SlowLock(lockPtr); 
  98.  *        }
  99.  *    }
  100.  *
  101.  *----------------------------------------------------------------------
  102.  * typedef struct Sync_UserLock {
  103.  *    Boolean inUse;              // 1 while the lock is busy 
  104.  *    Boolean waiting;            // 1 if someone wants the lock
  105.  * } Sync_UserLock;
  106.  *
  107.  */
  108.  
  109. ENTRY(Sync_GetLock)
  110.     movl    SPARG0, %eax        # address of lock
  111.     movl    $1, %edx        # 1 == locked
  112.     xchgl   %edx, (%eax)            # try for lock
  113.         cmpl    $0, %edx            # got it?
  114.         jne     1f                      # nope -- do it the hard way.
  115.     RETURN                # got it!
  116.     /*
  117.      * Didn't get the lock on first attempt.  Call kernel.
  118.      */
  119. 1:    pushl    %eax            # lockPtr
  120.     CALL    _Sync_SlowLock        # call kernel to get lock
  121.     addl    $4, %esp        # clear stack
  122.     RETURN                # done
  123. @
  124.  
  125.  
  126. 1.1
  127. log
  128. @Initial revision
  129. @
  130. text
  131. @d17 1
  132. a17 1
  133.     .asciz "$Header: Sync_GetLock.s 1.2 90/03/05 $ SPRITE (Berkeley)"
  134. d22 3
  135. d75 2
  136. a76 2
  137.  *    Boolean inUse;              /* 1 while the lock is busy */
  138.  *    Boolean waiting;            /* 1 if someone wants the lock */
  139. @
  140.